﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Szamlazz.Utils;
using S = Szamlazz.Data.Response;

namespace Szamlazz.Data
{ 
	/// <summary>
	/// Számla adat entitás
	/// </summary>
	public class Invoice
	{
		/// <summary>
		/// A kérés alapján létrehozza a számlát
		/// </summary>
		/// <param name="request">A számla kérés objektum</param>
		public Invoice(InvoiceRequest request)
		{
			this.Request = request;
		}

		/// <summary>
		/// Kérés példány
		/// </summary>
		public InvoiceRequest Request { get; private set; }
		/// <summary>
		/// Válaszként érkező PDF adat (ha érkezik)
		/// </summary>
		public byte[] Pdf { get; private set; }
		/// <summary>
		/// Számla készítés sikeres volt-e
		/// </summary>
		public bool IsSuccessfull { get; private set; }
		/// <summary>
		/// Elkészült számla száma
		/// </summary>
		public string InvoiceNumber { get; private set; }
		/// <summary>
		/// Elkészült számla bruttó értéke
		/// </summary>
		public double GrossValue { get; private set; }
		/// <summary>
		/// Elkészült számla nettó értéke
		/// </summary>
		public double NetValue { get; private set; }
		/// <summary>
		/// Az elkészült száma e-számla-e
		/// </summary>
		public bool IsESigned { get; private set; }
		/// <summary>
		/// Számlakészítés során fellépő hibák listája
		/// </summary>
		public IEnumerable<Error> Errors { get { return this._Errors; } }
		/// <summary>
		/// Belső adattag a hibák számára
		/// </summary>
		private List<Error> _Errors = new List<Error>();
		/// <summary>
		/// Számla típusa
		/// </summary>
		public InvoiceType InvoiceType
		{
			get { return this.Request.InvoiceType; }
		}

		/// <summary>
		/// A számla válaszból készíti el a számla példányt
		/// </summary>
		/// <param name="data">válasz adat</param>
		/// <param name="isESigned">e-számla flag</param>
		internal void FromResponse(S.szamlavalasz data, bool isESigned)
		{
			this.IsSuccessfull = data.sikeres;

			if (this.IsSuccessfull)
			{
				this.InvoiceNumber = data.szamlaszam;
				this.GrossValue = data.szamlabruttoSpecified ? data.szamlabrutto : 0D;
				this.NetValue = data.szamlanettoSpecified ? data.szamlanetto : 0D;
				this.IsESigned = isESigned;

				if (data.pdf != null)
				{
					this.Pdf = data.pdf;
				}
				else if(this.Request.DownloadPdf)
				{
					this.IsSuccessfull = false;
					this._Errors.Add(new Error(1000, "A válasz üzenet nem tartalmazza az elvárt PDF állományt!"));
				}
			}
			else
			{
				this.InvoiceNumber = data.szamlaszam;
				this._Errors.Add(new Error(data));
			}
		}

		/// <summary>
		/// Kivételből készíti el a számla példányt
		/// </summary>
		/// <param name="ex">Kivétle</param>
		internal void FromException(Exception ex)
		{
			this.IsSuccessfull = false;
			this._Errors.Add(new Error(2000, ex.Message));
		}

		/// <summary>
		/// Validációs eredményből készíti el a számla objektum példányt
		/// </summary>
		/// <param name="validation"></param>
		internal void FromValidation(ValidationResult validation)
		{
			this.IsSuccessfull = false;
			foreach (var err in validation.Errors)
			{
				this._Errors.Add(err);
			}
		}
	}
}
